package utils

import (
	"menu-generation-go/config"
	"time"

	"github.com/dgrijalva/jwt-go"
)

type Claims struct {
	SessionID uint `json:"session_id"`
	UserID    uint `json:"user_id"`
	jwt.StandardClaims
}

// GenerateToken 生成JWT token - redis
func GenerateToken(sessionID, userID uint) (string, error) {
	expireTime := time.Now().Add(time.Duration(config.SysConfig.JWT.Expire) * time.Hour)

	claims := Claims{
		SessionID: sessionID,
		UserID:    userID,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expireTime.Unix(), // payload 包含必要信息，过期时间戳
			Issuer:    "go-login",        // 签发者
		},
	}

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString([]byte(config.SysConfig.JWT.Secret))
}

// ParseToken 解析JWT token
func ParseToken(tokenString string) (*Claims, error) {
	token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
		return []byte(config.SysConfig.JWT.Secret), nil
	})

	if err != nil {
		return nil, err
	}

	if claims, ok := token.Claims.(*Claims); ok && token.Valid {
		return claims, nil
	}

	return nil, err
}
